package com.baidu.controller;

import com.baidu.model.pojo.User;
import com.baidu.model.vo.Result;
import com.baidu.service.IUserService;
import com.baidu.util.JWTUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.concurrent.TimeUnit;

@Controller
@RequestMapping("/user")
//@CrossOrigin // 允许跨域
public class UserController {

    //控制层调用service
    @Autowired
    private IUserService userService;

    @Autowired
    private MailSender mailSender;

    @Autowired
    private RedisTemplate redisTemplate;

    /** http://localhost:8081/baidu/user/code?email=dfdfdfdd@qq.com
     * xml也是一种数据交互的格式,不够轻便,浏览器处理xml速度低于json
     *
     *  url?key1=value1&key2=value2&key3=value3
     *  保证参数的名称和key的名称保持一致,就可以实现参数的自动绑定
     *
     * 为甚返回的要转成json格式
     * json格式是后端和前端交互数据的一种默认采取的一种友好的格式
     * @return
     */
    @GetMapping("/code")
    @ResponseBody // 将控制层的方法统一转换成json字符串返回出去
    public Result sendCode(String email){
        //1. 判断email在db表中是否存在,如果不存在,说明还没有注册
        User user = userService.login(email);
        //2. 判断user是否为null
        if(user != null){
            //3. 说明用户是存在的 - 邮箱发送...
            //[10000,99999]之间的随机整数
            //随机码 - 放入到redis中,设置验证码的过期时间
            int n = (int) (Math.random()*90000 + 10000);
            //将int类型转成String类型
            //java.lang.String提供的static String valueOf(int n);
            String code = String.valueOf(n);

            //邮箱的代码
            //定义一个对象,封装邮箱的一些数据
            SimpleMailMessage msg = new SimpleMailMessage();
            //邮箱包含的内容
            //发送方 - 配置文件中配置的那个邮箱
            msg.setFrom("1909626808@qq.com");
            //标题
            msg.setSubject("江苏科技大学");

            //内容
            msg.setText(code);

            //接收方 - 登录用户输入的邮箱
            msg.setTo(email);

            //把这个对象发送到qq邮箱
            mailSender.send(msg);

            //将验证码放入到redis中,并且设置过期时间
            ValueOperations vop = redisTemplate.opsForValue();
            vop.set(email,code,100, TimeUnit.SECONDS);

            //发送成功的状态...
            return new Result("200","验证码发送成功,请您查看邮箱",null);
        }
        return new Result("500","邮箱不存在!",null);
    }

    @PostMapping("/login")
    @ResponseBody
    public Result login(String email,String code){
        //1. 验证email是否在db中存在
        User user = userService.login(email);
        if(user == null)
            return new Result("404","用户不存在!",null);
        //2. 判断验证码是否有效
        // 根据key从redis尝试获取验证码
        String redisCode = (String) redisTemplate.opsForValue().get(email);
        if(null == redisCode)//过期了...
            return new Result("500","验证码过期了!",null);
        //3. 进行验证码的校验
        if(!redisCode.equals(code))
            return new Result("400","验证码错误!",null);

        //登录成功,server端生成一个token
        String token = JWTUtils.geneJsonWebToken(user);
        //放入到redis中
        redisTemplate.opsForValue().set(token,"login",100,TimeUnit.MINUTES);
        return new Result("200","登录成功!",token);
    }
}